import time

ONE_WEEK_IN_SECONDS=7*86400  #一周秒数
VOTE_SCORE=432  #点赞一次增加的分值

#投票
def article_vote(conn,user,article):
    cutoff=time.time()-ONE_WEEK_IN_SECONDS
    #提示：本案例使用冒号作为分隔符
    if conn.zscore('time:',article)<cutoff:
        #判断文章发布时间是否已经超过七天
        return

    article_id=article.partition(':')[-1]
    if conn.sadd('voted:'+article_id,user):
        #如果用户是第一次为文章投票，那么增加这篇文章的投票数量和评分
        conn.zincrby('score:',article,VOTE_SCORE)
        conn.hincrby(article,'votes',1)

#发布文章
def post_article(conn,user,title,link):
    article_id=str(conn.incr('article:'))

    voted='voted:'+article_id

    conn.sadd(voted,user)
    conn.expire(voted,ONE_WEEK_IN_SECONDS)

    now=time.time()
    article='article:'+article_id
    conn.hmset(article,{
        'title':title,#文章标题
        'link':link,#文章链接
        'poster':user,
        'time':now,
        'votes':1
    })

    conn.zadd('score:',article,now+VOTE_SCORE)
    conn.zadd('time',article,now)

    return article_id


ARTICLES_PER_PAGE=25 #每页展示数量

def get_articls(conn,page,order='score:'):
    start=(page-1)*ARTICLES_PER_PAGE  #设置文章的起始索引
    end=start+ARTICLES_PER_PAGE-1     #设置文章的结束索引

    ids=conn.zrevrange(order,start,end) #获取多个文章ID

    articles=[]

    for id in ids:
        article_data=conn.hgetall(id)
        article_data['id']=id
        articles.append(article_data)
    return articles

#将文章添加到群组里面的方法，以及从群组里面移除文章的方法
def add_remove_groups(conn,article_id,to_add=[],to_remove=[]):
    article='article:'+article_id
    for group in to_add:
        conn.sadd('group:'+group,article) #将文章添加到它所属的群组里面
    for group in to_remove:
        conn.srem('group:'+group,article) #从群组里面移除文章


#分页并获取群组文章
def get_group_articles(conn,group,page,order='score:'):
    key=order+group #为每个群组的每种排列顺序都创建一个键
    #检查是否已有缓存的排序结果，如果没有的话现在就进行排序
    if not conn.exists(key):
        conn.zinterstore(key,
                         ['group:'+group,order],
                         aggregate='max')
        conn.expire(key,60) #让redis在60秒后自动删除这个有序集合
    return get_articls(conn,page,key)